/**
* Copyright SocialSite (C) 2009
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.socialsite.dao.hibernate;
import java.util.List;
import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import com.socialsite.dao.AbstractDao;
/**
* Abstract DAO implementation for all the Domain class
*
* @author Ananth
*/
public abstract class AbstractDaoImpl<T> implements AbstractDao<T>
{
/** class of the domain */
protected final Class<T> domainClass;
/** Hibernate sessionFactory to access the database */
private SessionFactory sessionFactory;
/**
* constructor
*
* @param domainClass
* domainClass
*/
public AbstractDaoImpl(final Class<T> domainClass)
{
this.domainClass = domainClass;
}
/**
* helper method to find the count of item that match the filter
*
* @param filter
* filter text
* @param clazz
* class of the item
* @param field
* field that will be matched with the criteria
* @return
*/
@SuppressWarnings("unchecked")
protected int count(String filter, final Class clazz, final String field)
{
// Avoids NPE
filter = filter == null ? "" : filter;
final Criteria criteria = getSession().createCriteria(clazz);
criteria.add(Restrictions.ilike(field, filter, MatchMode.ANYWHERE));
criteria.setProjection(Projections.rowCount());
return (Integer)criteria.uniqueResult();
}
/**
* find the number of unique rows in the given domainclass (table)
*
* @return no of unique rows in the given domainclass (table)
*/
public int countAll()
{
final Criteria criteria = getSession().createCriteria(domainClass);
criteria.setProjection(Projections.rowCount());
return (Integer)criteria.uniqueResult();
}
/**
* removes the given domainclass object from the Database
*
* @param object
* object to be deleted
*/
public void delete(final T object)
{
getSession().delete(object);
}
/**
* a helper method to find the list of item matching the filter
*
* @param filter
* filter text
* @param first
* first index of the resul
* @param count
* count
* @param sortParam
* sorting is done based on this property
* @param clazz
* class of the item
* @param field
* field that will be matched with the criteria
* @return list of item matching the filter text
*/
@SuppressWarnings("unchecked")
protected List find(String filter, final int first, final int count, final SortParam sortParam,
final Class clazz, final String field)
{
// avoids the NPE
filter = filter == null ? "" : filter;
// order
final Order order = sortParam.isAscending() ? Order.asc(sortParam.getProperty()) : Order
.desc(sortParam.getProperty());
final Criteria criteria = getSession().createCriteria(clazz);
criteria.setFirstResult(first);
criteria.setMaxResults(count);
criteria.add(Restrictions.ilike(field, filter, MatchMode.ANYWHERE));
criteria.addOrder(order);
return criteria.list();
}
/**
* find all the rows in the table and return it as a list
*
* @return List contains all the rows in the given domainclass (table)
*/
@SuppressWarnings("unchecked")
public List<T> findAll()
{
final Criteria criteria = getSession().createCriteria(domainClass);
return criteria.list();
}
/**
* get hibernate Session from SessionFactory
*
* @return Hibernate Session
*/
public Session getSession()
{
return sessionFactory.getCurrentSession();
}
/**
* getter
*
* @return hibernate SessionFactory
*/
public SessionFactory getSessionFactory()
{
return sessionFactory;
}
/**
* load the domainclass of the given id
*
* @param id
* id of the object
* @return entity object or null if the id doesn't match
*/
@SuppressWarnings("unchecked")
public T load(final long id)
{
return (T)getSession().get(domainClass, id);
}
/**
* merges the Detached object with the Session
*
* @param object
* object to be merged
*/
@SuppressWarnings("unchecked")
public T merge(final T object)
{
return (T)getSession().merge(object);
}
/**
* saves or update the object state in the database
*
* @param object
* object to be saved
*/
public void save(final T object)
{
getSession().saveOrUpdate(object);
}
/**
* setter
*
* @param sessionFactory
* Hibernate sessionFactory
*/
public void setSessionFactory(final SessionFactory sessionFactory)
{
this.sessionFactory = sessionFactory;
}
}